package cn.iocoder.yudao.server.framework.magicapi.config;

import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.ssssssss.magicapi.core.context.MagicUser;
import org.ssssssss.magicapi.core.exception.MagicLoginException;
import org.ssssssss.magicapi.core.interceptor.Authorization;
import org.ssssssss.magicapi.core.interceptor.AuthorizationInterceptor;
import org.ssssssss.magicapi.core.model.Group;
import org.ssssssss.magicapi.core.model.MagicEntity;
import org.ssssssss.magicapi.core.servlet.MagicHttpServletRequest;

/**
 * 自定义操作鉴权
 */
@Component  //注入到Spring容器中
public class MagicApiCustomAuthorizationInterceptor implements AuthorizationInterceptor {

	// 自定义登录的逻辑请参考上一篇文章
    
    // 对于登录走自身应用的，MagicUser 对象会为空，此时需要自己获取当前登录的用户信息。
	@Autowired
	OAuth2TokenApi oauth2TokenApi;
	/**
	 * 配置是否需要登录
	 */
	@Override
	public boolean requireLogin() {
		return true;
	}

	/**
	 * 根据Token获取User
	 */
	@Override
	public MagicUser getUserByToken(String token) throws MagicLoginException {
		LoginUser user = SecurityFrameworkUtils.getLoginUser();

		if (user == null) { // websocket 走这里
			OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token);
			user = new LoginUser().setId(accessToken.getUserId()).setUserType(accessToken.getUserType())
					.setInfo(accessToken.getUserInfo()) // 额外的用户信息
					.setTenantId(accessToken.getTenantId()).setScopes(accessToken.getScopes())
					.setExpiresTime(accessToken.getExpiresTime());
		}

		if (user != null) {
			return new MagicUser(user.getId()+"",user.getInfo().get("nickname"), token);
		}
		throw new MagicLoginException("token无效");
	}

	@Override
	public MagicUser login(String username, String password) throws MagicLoginException {
		// 根据实际情况进行修改，如查询数据库。。
		if("admin".equals(username) && "admin".equals(password)){
			// 登录成功后 构造MagicUser对象。
			return new MagicUser("1","admin","tokenvalue......");
		}
		throw new MagicLoginException("用户名或密码不正确");
	}



	/**
	 * 是否拥有页面按钮的权限
	 */
	@Override
	public boolean allowVisit(MagicUser magicUser, MagicHttpServletRequest request, Authorization authorization) {
		// Authorization.SAVE 保存
		// Authorization.DELETE 删除
		// Authorization.VIEW 查询
		// Authorization.LOCK 锁定
		// Authorization.UNLOCK 解锁
		// Authorization.DOWNLOAD 导出
		// Authorization.UPLOAD 上传
		// Authorization.PUSH 推送
		return true;
	}

	/**
	 * 是否拥有对该接口的增删改权限
     * 此方法可以不重写，则走默认的 boolean allowVisit(MagicUser magicUser, MagicHttpServletRequest request, Authorization authorization) 方法
	 */
	@Override
	public boolean allowVisit(MagicUser magicUser, MagicHttpServletRequest request, Authorization authorization, MagicEntity entity) {
		// Authorization.SAVE 保存
		// Authorization.DELETE 删除
		// Authorization.VIEW 查询
		// Authorization.LOCK 锁定
		// Authorization.UNLOCK 解锁
		// 自行写逻辑判断是否拥有如果有，则返回true，反之为false
		return true;
	}
	
	/**
	 * 是否拥有对该分组的增删改权限
     * 此方法可以不重写，则走默认的 boolean allowVisit(MagicUser magicUser, MagicHttpServletRequest request, Authorization authorization) 方法
	 */
	@Override
	public boolean allowVisit(MagicUser magicUser, MagicHttpServletRequest request, Authorization authorization, Group group) {
		// Authorization.SAVE 保存
		// Authorization.DELETE 删除
		// Authorization.VIEW 查询
		// 自行写逻辑判断是否拥有如果有，则返回true，反之为false
		return true;
	}

}